﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using Worktool.CODE_Chris.SQL_DATA;

namespace Worktool.CODE_Chris.Word_Schnittstelle
{
    public class Word
    {
        private SQL sql;
        private WordLoadData wordLoad;
        private String saveFileBasePath = "";

        public Word()
        {
            init();
        }

        private void init()
        {
            sql = new SQL();
            wordLoad = new WordLoadData();
            getSaveFileBasePath();
        }

        private void getSaveFileBasePath()
        {
            if (Login.currentDBName == "Quantum") saveFileBasePath = Login.dictSettings["asc_quantum"];
            if (Login.currentDBName == "Hyperion") saveFileBasePath = Login.dictSettings["asc_hyperion"];
            if (Login.currentDBName == "Anthem") saveFileBasePath = Login.dictSettings["asc_anthem"];
        }

        public Boolean createFertigung(String idAuftrag)
        {
            //Daten laden
            String[,] data = wordLoad.loadDataHeader(idAuftrag);
            if (data != null) return loadWord("Templates\\"+Login.currentDBName+"\\MaterialFlow\\DeliveryChain\\Fertigung\\Fertigungsauftrag_TEMPLATE.doc", data, idAuftrag); else return false;
        }

        private Boolean loadWord(String filename, String[,] data, String idAuftrag)
        {
            try
            {
                if (data != null)
                {
                    if (exportWordFile(filename, data, idAuftrag)) return true; else return false;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception e)
            {
                //sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
                MessageBox.Show("Es fehlen Werte zum Erstellen der Word-Datei. Vorgang abgebrochen.", "Fehler");
                return false;
            }
        }

        public Boolean exportWordFile(String templatePath, String[,] data, String idAuftrag)
        {
            var word = new Microsoft.Office.Interop.Word.Application();

            //Netzlaufwerk-Ordner aus der XML-Datei
            String originalPath = Path.Combine(Login.dictSettings["netzwerkordner"], templatePath);
            try
            {
                String newPath;

                if (!Directory.Exists(saveFileBasePath))
                {
                    if (Login.currentDBName == "Quantum") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc_quantum' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen. Der Fertigungsauftrag wurde in der Datenbank unter der Nummer " + idAuftrag + " gespeichert, es wurde aber noch keine Word-Datei generiert.");
                    if (Login.currentDBName == "Hyperion") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc1_hyperion' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen. Der Fertigungsauftrag wurde in der Datenbank unter der Nummer " + idAuftrag + " gespeichert, es wurde aber noch keine Word-Datei generiert.");
                    if (Login.currentDBName == "Anthem") MessageBox.Show("Das in der 'asc.xml'-Datei im Tag 'asc2_anthem' hinterlegte Verzeichnis ist ungültig. Bitte dort ein gültiges Verzeichnis angeben, das Tool neu starten und den Vorgang wiederholen. Der Fertigungsauftrag wurde in der Datenbank unter der Nummer " + idAuftrag + " gespeichert, es wurde aber noch keine Word-Datei generiert.");
                }
                else
                {
                    newPath = saveFileBasePath + "\\"+idAuftrag+"\\"+idAuftrag+".doc";

                    if (!Directory.Exists(saveFileBasePath + "\\" + idAuftrag)) Directory.CreateDirectory(saveFileBasePath + "\\" + idAuftrag);
                    if (File.Exists(newPath)) File.Delete(newPath);

                    //Datei kopieren
                    System.IO.File.Copy(originalPath, newPath);

                    //Neue Word-Datei mit Daten füllen

                    word.Visible = false;
                    word.Documents.Open(newPath);

                    for (int a = 0; a < data.GetLength(1); a++)
                    {
                        //Auswahl aufheben und Cursor an den Start des Documents rücken
                        word.Selection.Move();
                        word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                        while (word.Selection.Find.Execute(data[0, a]))
                        {
                            //Auswahl aufheben und Cursor an den Start des Documents rücken
                            word.Selection.Move();
                            word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);

                            word.Selection.Find.Execute(data[0, a], ReplaceWith: data[1, a]);

                            //Auswahl aufheben und Cursor an den Start des Documents rücken
                            word.Selection.Move();
                            word.Selection.GoTo(Microsoft.Office.Interop.Word.WdGoToItem.wdGoToLine, Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToFirst, null, null);
                        }
                    }

                    wordLoad.processDetails(word, idAuftrag);

                    word.Quit(SaveChanges: true);
                    Marshal.ReleaseComObject(word);

                    System.Diagnostics.Process.Start(newPath);
                    return true;
                }

                return false;
            }
            catch (Exception e)
            {
                MessageBox.Show("Fehler in der Methode " + this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name + "\r\n\r\nFehlerbeschreibung;\r\n" + e.StackTrace, "Fehler");
                word.Quit(SaveChanges: false);
                Marshal.ReleaseComObject(word);
                //sql.log("FEHLER", e, this.ToString() + ":" + System.Reflection.MethodBase.GetCurrentMethod().Name);
                return false;
            }
        }

        

        public Boolean findFile(String filename)
        {
            if (File.Exists(Path.Combine(Login.dictSettings["netzwerkordner"], filename)))
            {
                return true;
            }
            else
            {
                MessageBox.Show("Die Template-Vorlage für dieses Schreiben wurde nicht gefunden. Vorgang abgebrochen.", "Fehler");
                return false;
            }

        }
        
    }
}
